package oop.controller.action.category;

import java.util.List;

import oop.controller.action.DefaultAction;
import oop.data.Category;
import oop.db.dao.CategoryDAO;

public class EditAction extends DefaultAction {

	@Override
	public void perform()
			throws Exception {
		try {
			int id = Integer.parseInt(request.getParameter("ce_id"));
			String submitted = request.getParameter("ce_submit");

			List<Category> categories = CategoryDAO.fetchById(id);
			if (categories.isEmpty()) { // kiểm tra thể loại tồn tại
				
				request.setAttribute("message", "Không tồn tại thể loại");
			} else {
				
				boolean error = false;
				Category category = categories.get(0);
				
				if ("update".equals(submitted)) {
					
					// cập nhật tên nếu không trùng 
					categories = CategoryDAO.fetchByName(request.getParameter("ce_name"));
					if (categories.isEmpty()) {
						category.setName(request.getParameter("ce_name"));
					} else {
						if (categories.get(0).getId() != category.getId()) {
							error = true;
							request.setAttribute("nameErr", "Trùng tên!");
						}
					}
				
					// cập nhật cha nếu không bị nối vòng 
					if ("none".equals(request.getParameter("ce_parent"))) {
						category.setParent(null);
					} else {
						int parentId = Integer.parseInt(request
								.getParameter("ce_parent"));
						categories = CategoryDAO.fetchById(parentId);
						if (categories.isEmpty()) { // kiểm tra thể loại cha tồn tại
							error = true;
							request.setAttribute("parentErr", "Thể loại cha không tồn tại");
						} else {
							Category parent = categories.get(0);
							if (parent.getAncestors().contains(category)) {
								error = true;
								request.setAttribute("parentErr", "Không thể liên kết vòng");
							} else {
								category.setParent(parent);
							}
						}
					}
					
					// lưu nếu không có lỗi 
					if (!error) {
						CategoryDAO.persist(category);
						setNextAction("category.list");
						return;
					}
				} else if ("cancel".equals(submitted)) {
					setNextAction("category.list");
					return;
				}

				request.setAttribute("category", category);
			}
		} catch (NumberFormatException ex) {
			request.setAttribute("message", "id không hợp lệ");
			setNextAction("error");
		}
	}

}
